﻿using Microsoft.AspNetCore.Builder;
using Sage.FreeSqlManager.Tenant;
using Sage.FreeSqlManager.Transaction;

namespace Sage.FreeSqlManager.Extensions
{
    /// <summary>
    /// 应用程序构建器扩展 - 提供中间件注册方法
    /// </summary>
    public static class AppExtensions
    {
        /// <summary>
        /// 使用租户中间件（使用默认租户ID解析逻辑）
        /// </summary>
        /// <param name="app">应用程序构建器</param>
        /// <param name="isDevelopment">是否为开发环境</param>
        /// <param name="devDefaultTenantId">开发环境默认租户ID，默认为1001</param>
        /// <returns>应用程序构建器</returns>
        /// <remarks>
        /// 建议在UseAuthentication之后、UseAuthorization之前使用此中间件
        /// </remarks>
        public static IApplicationBuilder UseTenantMiddleware(
            this IApplicationBuilder app,
            bool isDevelopment = false,
            long devDefaultTenantId = default)
        {
            ArgumentNullException.ThrowIfNull(app);

            var options = new TenantMiddlewareOptions
            {
                IsDevelopment = isDevelopment,
                DevDefaultTenantId = devDefaultTenantId
            };

            Console.WriteLine($"已启用租户中间件（使用默认租户ID解析逻辑）{(isDevelopment ? "，开发环境模式" : "")}");
            return app.UseMiddleware<TenantMiddleware>(options);
        }

        /// <summary>
        /// 使用租户中间件（使用自定义租户ID解析逻辑）
        /// </summary>
        /// <param name="app">应用程序构建器</param>
        /// <param name="resolver">自定义租户ID解析器</param>
        /// <returns>应用程序构建器</returns>
        /// <remarks>
        /// 自定义租户ID解析器应返回大于0的值表示有效的租户ID，返回0表示未找到有效的租户ID
        /// </remarks>
        public static IApplicationBuilder UseTenantMiddleware(
            this IApplicationBuilder app,
            TenantIdResolverDelegate resolver)
        {
            ArgumentNullException.ThrowIfNull(app);
            ArgumentNullException.ThrowIfNull(resolver);

            var options = new TenantMiddlewareOptions
            {
                TenantIdResolver = resolver
            };

            Console.WriteLine("已启用租户中间件（使用自定义租户ID解析逻辑）");
            return app.UseMiddleware<TenantMiddleware>(options);
        }

        /// <summary>
        /// 使用租户中间件（使用自定义租户ID解析逻辑，并配置开发环境）
        /// </summary>
        /// <param name="app">应用程序构建器</param>
        /// <param name="resolver">自定义租户ID解析器</param>
        /// <param name="isDevelopment">是否为开发环境</param>
        /// <param name="devDefaultTenantId">开发环境默认租户ID，默认为1001</param>
        /// <returns>应用程序构建器</returns>
        /// <remarks>
        /// 自定义租户ID解析器应返回大于0的值表示有效的租户ID
        /// 当自定义解析器返回0或负数且处于开发环境时，将使用默认租户ID
        /// </remarks>
        public static IApplicationBuilder UseTenantMiddleware(
            this IApplicationBuilder app,
            TenantIdResolverDelegate resolver,
            bool isDevelopment,
            long devDefaultTenantId = default)
        {
            ArgumentNullException.ThrowIfNull(app);
            ArgumentNullException.ThrowIfNull(resolver);

            var options = new TenantMiddlewareOptions
            {
                TenantIdResolver = resolver,
                IsDevelopment = isDevelopment,
                DevDefaultTenantId = devDefaultTenantId
            };

            Console.WriteLine($"已启用租户中间件（使用自定义租户ID解析逻辑）{(isDevelopment ? "，开发环境模式" : "")}");
            return app.UseMiddleware<TenantMiddleware>(options);
        }

        /// <summary>
        /// 使用事务中间件
        /// </summary>
        /// <param name="app">应用程序构建器</param>
        /// <returns>应用程序构建器</returns>
        /// <remarks>
        /// 建议在UseTenantMiddleware之后使用此中间件
        /// 需要注意，调用项目也需要添加Rougamo.Fody引用和创建FodyWeavers.xml 否则不起作用
        /// </remarks>
        public static IApplicationBuilder UseTransactionalMiddleware(
            this IApplicationBuilder app)
        {
            ArgumentNullException.ThrowIfNull(app);

            Console.WriteLine("已启用事务中间件");
            return app.UseMiddleware<TransactionMiddleware>();
        }
    }
}